Q:

Реализация функционала как у DataTable

Когда классу DataTable в методе Load отдается SqlDataReader, то DataTable автоматически генерирует все необходимое чтобы позже осуществить привязку к нему с автоматической генерацией столбцов. Как такое же можно реализовать ручками? т.е. чтобы я по заранее неизвестному набору данных их SqlDataReader смог сгенерировать список, который потом можно было бы указать как источник данных для DataGrid'а?

A:

Нашел в интернете решение. Может кому пригодиться. Правда столбцы приходится самому создавать в коде. Пока не разобрался как сделать, чтобы они генерировались автоматически.
// Класс, который будет представлять строку
public class DictionaryDataObject : Dictionary<string, object>, ICustomTypeDescriptor
{
    public AttributeCollection GetAttributes()
    {
        return AttributeCollection.Empty;
    }

    public string GetClassName()
    {
        return "DictionaryDataObject";
    }

    public string GetComponentName()
    {
        return null;
    }

    public TypeConverter GetConverter()
    {
        return null;
    }

    public EventDescriptor GetDefaultEvent()
    {
        return null;
    }

    public PropertyDescriptor GetDefaultProperty()
    {
        return null;
    }

    public object GetEditor(Type editorBaseType)
    {
        return null;
    }

    public EventDescriptorCollection GetEvents(Attribute[] attributes)
    {
        return EventDescriptorCollection.Empty;
    }

    public EventDescriptorCollection GetEvents()
    {
        return EventDescriptorCollection.Empty;
    }

    public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    {
        var pds =
        Keys
        .Select(x => new DictionaryPropertyDescriptor(x))
        .ToArray();
        return new PropertyDescriptorCollection(pds);
    }

    public PropertyDescriptorCollection GetProperties()
    {
        return GetProperties(null);
    }

    public object GetPropertyOwner(PropertyDescriptor pd)
    {
        return this;
    }
} 

// Класс для работы со свойствами
public class DictionaryPropertyDescriptor : PropertyDescriptor
    {
        public DictionaryPropertyDescriptor(string name) : base(name, null) { }
        public override bool CanResetValue(object component) { return false; }
        public override Type ComponentType { get { return null; } }
        public override bool IsReadOnly { get { return false; } }
        public override Type PropertyType { get { return typeof(object); } }
        public override void ResetValue(object component) { }
        public override bool ShouldSerializeValue(object component) { return false; }

        public override object GetValue(object component)
        {
            var dic = component as DictionaryDataObject;
            if (dic == null) return null;
            return dic[Name];
        }

        public override void SetValue(object component, object value)
        {
            var dic = component as DictionaryDataObject;
            if (dic == null) return;
            dic[Name] = value;
        }
    }

Для работы создаем:
ObservableCollection<DictionaryDataObject>

Создаем столбцы с привязкой:
column = new DataGridCheckBoxColumn
                             {
                                 new Binding(header) { Mode = BindingMode.OneWay }, 
                                 Header = header
                             };
dataGrid.Columns.Add(column);

И в качестве ItemsSource указываем созданную ранее коллекцию.
Вот ссылка на первоисточник.
Вопрос закрыт

