◆ 直接 Grid に配置する要素を置かずに td 風なセルのコントロールを置いてその中に入れるようにする
◆ マージンは GridCell に対して設定できる
◆ 要素自体に Grid.Row などの属性を書かなくていいのでコピペや移動しやすい

WPF って便利なのに足りてない部分もけっこうあります
TextBox に placeholder はつけられないし Grid のセルに共通でマージンをつけられません
やっぱり Web の CSS が一番使いやすい と思うのですが 使えないままも不便なのでマージンを付ける方法を考えてみました

Grid の中の子要素全部に適用できるリソース (CSS でいう >*) があればいいのですが ないそうです
共通のベースクラスにつけてもダメらしく 地道に使うコントロール名を書いていくことになります

そこで思ったのが HTML のテーブルのように td セル的なものをでラップさせればいいんじゃない?ということです
内側の要素の Button などに Grid.Row や Grid.Column プロパティがあるのはあんまり好きじゃないのと 他の場所にコピペしたいときに書き換えが面倒です
td のようなコントロールの内側に Button などを配置すれば 長くはなるもののコピペのしやすさや XAML 属性が少なくて読みやすくなります

そのまま

<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>

<Button Grid.Row="0" Grid.Column="0"></Button>
<Rectangle Grid.Row="0" Grid.Column="1" Fill="Azure"></Rectangle>
<Button Grid.Row="0" Grid.Column="2"></Button>

<Rectangle Grid.Row="1" Grid.Column="0" Fill="Pink"></Rectangle>
<TextBox Grid.Row="1" Grid.Column="1"></TextBox>
<Rectangle Grid.Row="1" Grid.Column="2" Fill="LightYellow"></Rectangle>

<Button Grid.Row="2" Grid.Column="0"></Button>
<Rectangle Grid.Row="2" Grid.Column="1" Fill="GreenYellow"></Rectangle>
<Button Grid.Row="2" Grid.Column="2"></Button>
</Grid>
</Window>

gridmargin01

GridCell

td にあたるコントロールを作ります
マージンを設定するだけでいいので単純に子要素を表示するだけです

[GridCell.xaml]
<UserControl x:Class="WpfApp1.GridCell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<ContentPresenter></ContentPresenter>
</Grid>
</UserControl>

これを使って MainWindow を書き換えます

[MainWindow.xaml]
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="300" Width="400">
<Grid>
<Grid.Resources>
<Style TargetType="local:GridCell">
<Setter Property="Margin" Value="5"/>
</Style>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>

<local:GridCell Grid.Row="0" Grid.Column="0">
<Button></Button>
</local:GridCell>
<local:GridCell Grid.Row="0" Grid.Column="1">
<Rectangle Fill="Azure"></Rectangle>
</local:GridCell>
<local:GridCell Grid.Row="0" Grid.Column="2">
<Button></Button>
</local:GridCell>

<local:GridCell Grid.Row="1" Grid.Column="0">
<Rectangle Fill="Pink"></Rectangle>
</local:GridCell>
<local:GridCell Grid.Row="1" Grid.Column="1">
<TextBox></TextBox>
</local:GridCell>
<local:GridCell Grid.Row="1" Grid.Column="2">
<Rectangle Fill="LightYellow"></Rectangle>
</local:GridCell>

<local:GridCell Grid.Row="2" Grid.Column="0">
<Button></Button>
</local:GridCell>
<local:GridCell Grid.Row="2" Grid.Column="1">
<Rectangle Fill="GreenYellow"></Rectangle>
</local:GridCell>
<local:GridCell Grid.Row="2" Grid.Column="2">
<Button></Button>
</local:GridCell>
</Grid>
</Window>

gridmargin02

GridCell の分長いですが Button などは Grid の場所情報を持たずに済むのでシンプルですし コピペが楽です
今は本当に中身を表示するだけで GridCell らしい動きは何もしてませんが GridCell ならではのプロパティやメソッドを追加していけばいい感じになるかなと思います