You can defer the overload resolution to the runtime by using the dynamic
keyword:
foreach (DataColumn column in data.Columns)
{
ICell cell = dataRow.CreateCell(column.Ordinal);
cell.SetCellValue((dynamic)row[column]);
}
Please note that this will fail with a runtime exception if there is no matching overload.