Один из способов сделать это использование события CellsPainting. Чтобы нарисовать изображение для конкретной ячейки заголовка.
this.headerImages -
ImageList изображения для столбцов
void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.ColumnIndex != -1 && e.RowIndex == -1)
{
e.PaintBackground(e.ClipBounds, false);
Point pt=e.CellBounds.Location;
int offset=(e.CellBounds.Width-this.headerImages.ImageSize.Width)/2;
pt.X += offset;
pt.Y += 1;
this.images.Draw(e.Graphics, pt, e.ColumnIndex);
// Для случая, если не хранить изображения в ImageList, e.Graphics.DrawImage (image, Pt); e.Handled = true;
}
}