I eventually solved this, after reading through C1's incredibly unhelpful 'example' on how to use unbound fields, I put together my own code to handle it.
Since I was using lists generated from Linq, I had to first convert them to datatables, aided by 'FastMember' which makes the table generation instant (and pretty painless to code).
Then the hashtable and get/set events handle data being loading into and out of the grid, be careful not to give names to any unbound columns or the grid will fail to render:
Hashtable _hash = new Hashtable();
private static DataTable CreateTable<T>(List<T> List)
{
DataTable OutTable = new DataTable();
using (var reader = ObjectReader.Create(List))
{
OutTable.Load(reader);
}
return OutTable;
}
private void c1FlexGrid1_GetUnboundValue(object sender, C1.Win.C1FlexGrid.UnboundValueEventArgs e)
{
DataRowView drv = (DataRowView)c1FlexGrid1.Rows[e.Row].DataSource;
e.Value = _hash[e.Row.ToString() + "|" + e.Col.ToString()];
}
private void c1FlexGrid1_SetUnboundValue(object sender, C1.Win.C1FlexGrid.UnboundValueEventArgs e)
{
DataRowView drv = (DataRowView)c1FlexGrid1.Rows[e.Row].DataSource;
_hash[e.Row.ToString() + "|" + e.Col.ToString()] = e.Value;
}