Dynamiczne wiązanie kolumn w Xaml

To kolejne pytanie z wcześniejszego posta (tutaj).

Mam pewne „nagłówki” przechowywane jako:Dictionary<string,string> - gdzie pierwszy ciąg reprezentuje nazwę pola, a drugi nagłówek, który chcę wyświetlić.

Mam zestaw dynamicznych danych przechowywanych jako:Dictionary<string, object> - gdzie łańcuch jest nazwą pola.

Łączę się z tym w xaml jako:

<data:DataGrid Name="_dataGrid" AutoGenerateColumns="True"  IsReadOnly="False" Margin="5" Height="200">
            <data:DataGrid.Columns>
                <data:DataGridTextColumn Header="Forename" CanUserSort="True" SortMemberPath="Forename" 
                                          Binding="{Binding Converter={StaticResource RowIndexConverter},
                                            ConverterParameter=Forename}"/>
                <data:DataGridTextColumn Header="Surname" CanUserSort="True" SortMemberPath="Surname" 
                                         Binding="{Binding Converter={StaticResource RowIndexConverter},
                                            ConverterParameter=Surname}"/>
                <data:DataGridTextColumn Header="Age" CanUserSort="True" SortMemberPath="Age" 
                                         Binding="{Binding Converter={StaticResource RowIndexConverter},
                                            ConverterParameter=Age}"/>
                <data:DataGridTextColumn Header="Shoesize" CanUserSort="True" SortMemberPath="Shoesize" 
                                         Binding="{Binding Converter={StaticResource RowIndexConverter},
                                            ConverterParameter=Shoesize}"/>                
            </data:DataGrid.Columns>
        </data:DataGrid> 

Problem 1 Chcę automatycznie wygenerować te kolumny (używając dostarczonych informacji nagłówka)

Problem 2 Chcę, aby kolumny były generowane w oparciu o typ danych, którym są (i.e. boolean = pole wyboru)

Problem 3 Idealnie chciałbym również określić pogodę, którą przycisk powinien istnieć w pierwszej kolumnie lub nie (tj. Przycisk edycji / przeglądania) poprzez wiązanie danych

questionAnswers(1)

yourAnswerToTheQuestion