Моим решением было бы использовать расширитель с горизонтальной стековой панелью для Column1, другой расширитель с горизонтальной стековой панелью для Column2, а для столбцов с 3 по 8 использовать сетку данных.Все это содержимое получено из элементов управления, определенных в сетке.Сами данные могут быть определены как наблюдаемый источник сбора, который может обновляться в зависимости от потребностей программы.
<ItemsControl ItemsSource="{Binding Datasource1}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel >
</StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Expander Header="Header1" >
<Expander.HeaderTemplate>
<DataTemplate>
<StackPanel>
</StackPanel>
</DataTemplate>
</Expander.HeaderTemplate>
<Grid>
<ItemsControl ItemsSource="{Binding Datasource2}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Expander Header="Header2">
<Expander.HeaderTemplate>
<DataTemplate>
<StackPanel>
</StackPanel>
</DataTemplate>
</Expander.HeaderTemplate>
<DataGrid ItemsSource="{Binding Datasource3to8}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTextColumn Header="Test"
Width="Auto"
Binding="{Binding Datasource3}" />
<DataGridTextColumn Header="Test"
Width="Auto"
Binding="{Binding Datasource4}" />
<DataGridTextColumn Header="Test"
Width="Auto"
Binding="{Binding Datasource5}" />
<DataGridTextColumn Header="Test"
Width="Auto"
Binding="{Binding Datasource6}" />
<DataGridTextColumn Header="Test"
Width="Auto"
Binding="{Binding Datasource7}" />
<DataGridTextColumn Header="Test"
Width="Auto"
Binding="{Binding Datasource8}" />
</DataGrid.Columns>
</DataGrid>
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Другим вариантом будет использование сетки иерархических данных.