はい、1)の両方を行うことができます。基本は、各アイテムが別のItemsControlであるItemsControlが必要であるということです(行、列を取得するため)。テンプレートを変更するには、ItemTemplateを明示的に割り当てる代わりに、DataTypeがありKeyがないDataTemplateリソースを使用するのが最も簡単な方法です。DataTemplateSelectorを使用することもできますが、これにはもう少しコードが必要です。テンプレートは次のようになります。
<Window.Resources>
<DataTemplate DataType="IFarmyardSpaces">
<Button Style="..."/>
</DataTemplate>
<DataTemplate DataType="FenceSpaces">
<Button Style="..."/>
</DataTemplate>
</Window.Resources>
そして、ItemsControlは次のようになります。ここでは、UniformGridを使用して、均等に分割されたグリッドレイアウトを取得します。
<ItemsControl ItemsSource="{Binding TwoDArray}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="1"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="1"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
配列がすべて同じサイズでない場合の配置や、同じタイプを別のコントロールにバインドしている場合にテンプレートが他の場所に適用されるなどの問題が発生する可能性がありますが、これで少なくとも開始できます。