Установите размеры изображения одинаковыми и используйте вместо этого WrapPanel:
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Border Margin="5" >
<Image Source="{Binding}" Stretch="Uniform" Width="400" Height="400"/>
</Border>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
В качестве альтернативы, если вам нужно фиксированное количество столбцов, не указывайте размеры изображения вообще, а вместо этого используйте UniformGrid:
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Border Margin="5" >
<Image Source="{Binding}" Stretch="Uniform" />
</Border>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<UniformGrid Columns="3" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
ОБНОВЛЕНИЕ: Сейчас я немного растерялся, чтобы точно понять, что именно вы пытаетесь сделать, размещаемые вами изображения не соответствуют вашему описанию. Если вы хотите, чтобы панели были квадратными, а изображения масштабировались до них равномерно с тонкой рамкой вокруг них, то вам нужно будет сделать несколько вещей:
1) измените свой ListBoxItem ControlTemplate на Border с прозрачным фоном и ContentPresenter внутри него. Это гарантирует, что ваша желтая рамка не заполняет всю рамку, а остальная часть рамки не выделяется при выборе, но вы все равно можете щелкнуть в любом месте на ней, чтобы выбрать ее.
2) измените ваш ItemTemplate на сетку (чтобы он заполнял все доступное пространство) с границей, центрированной по центру с отступом (чтобы вы могли видеть желтую рамку при выборе), затем поместите содержимое вашего изображения в это, но оберните.
Это должно сделать работу:
<Style TargetType="{x:Type ListBox}" x:Key="PictureListBoxStyle">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Grid Margin="5">
<Border Padding="5" HorizontalAlignment="Center" VerticalAlignment="Center">
<Border.Style>
<Style TargetType="Border">
<Setter Property="Background" Value="Transparent" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}}" Value="True">
<Setter Property="Background" Value="Yellow" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Image Source="{Binding}" Stretch="Uniform" />
</Border>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<UniformGrid Columns="3" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
</Style>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}" >
<Border Background="Transparent">
<ContentPresenter />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Если это по-прежнему не так, вам необходимо более четко определить ваши требования.