you could use the cell formatting event because this event is fired only for cells that are visible
dataGridView1.CellFormatting += new DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting);
and put your color formatting code in the event handler
void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
I hope you are binding to the datagridview ... (instead of manually creating each row).
Hope that helped!