I do not know if this decision is correct, but I approached something similar, in despair:
foreach (NavField field in this.Fields)
{
DataGridTextColumn column = new DataGridTextColumn();
column.Header = field.FieldNo.ToString();
if (!field.Active || !field.Show)
column.Visibility = System.Windows.Visibility.Collapsed;
grid.Columns.Add(column);
}
Then I add datatable as itemssource:
this.dataGridLines.ItemsSource = dataTable.DefaultView;
datatable, datatable , , ..