si, devi intercettare l'evento rowDataBound...

cioe un evento scatenato ogni volta sche viene caricata una riga.
tu quella riga la lasci vuota per quella cella.
dopo di che:

DataRowView rigaDelDataSource = (DataRowView ) e.Item.DataItem;

if(rigaDelDataSource["campo2"] == null || rigaDelDataSource["campo2"] == DbNull.Value)
e.Cells[1].Text =rigaDelDataSource["campo3"] + " " + rigaDelDataSource["campo4"];
else
e.Cells[1].Text =rigaDelDataSource["campo2"]

so che puo sembrare ambiguo, ma cerca un po di info su rowDataBound (anche sll'msdn) e tutto ti sembrera piu chiaro!