Что вам нужно будет сделать, это создать запрос, который каким-то образом группирует ваши элементы по категориям (либо у вас это уже есть, либо вы можете использовать linq для создания вашей иерархии через запрос Группировать по ... в запрос).
Затем вы можете использовать ItemsControl, который привязывается к результату запроса, отображая данные с ItemTemplate, содержащим заголовок, и другой ItemsControl, у которого ItemsPanelTemplate установлено в WrapPanel или UniformGrid.
Предполагая, что вам удастся получить данные в следующих классах (извините, VB здесь, но C # не так уж далек от этого, если вам это нужно):
Public Class Category
Private _Name As String
Public Property CategoryName() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Private _SubCategories As New List(Of SubCategory)
Public Property SubCategories() As List(Of SubCategory)
Get
Return _SubCategories
End Get
Set(ByVal value As List(Of SubCategory))
_SubCategories = value
End Set
End Property
End Class
Public Class SubCategory
Private _Name As String
Public Property SubCategoryName() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
End Class
<ItemsControl ItemsSource="{Binding QueryResult}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderThickness="1"
BorderBrush="Black">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Border BorderThickness="1"
BorderBrush="Black">
<TextBlock Margin="2"
Text="{Binding CategoryName}" />
</Border>
<ItemsControl Grid.Row="1"
ItemsSource="{Binding SubCategories}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderThickness="1"
BorderBrush="Black">
<TextBlock Margin="2"
Text="{Binding SubCategoryName}" />
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="3" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Это очень грубый шаблон, вам придется повозиться с границами, чтобы получить то, что вам нужно, но это бы сработало.