The issue is not the DataGrid, but that the DataGridColumn already has an DataGridOwner when it is added a second time. The solution is to clear the DataGridOwner property of the DataGridColumn like Rune Anderson posted in another question.
Thanks to Rune Anderson who posted this answer in a comment in How do I bind a WPF DataGrid to a variable number of columns?
Table.Columns.Clear();
foreach (var column in columns)
{
var dataGridOwnerProperty = column.GetType().GetProperty("DataGridOwner", BindingFlags.Instance | BindingFlags.NonPublic);
dataGridOwnerProperty?.SetValue(column, null);
Table.Columns.Add(column);
}
note: this is also what @mtopp says in his comment.