I'm assuming you're not really interested in a UniformGrid, but rather looking for a way to have a vertical ScrollViewer inside an horizontal ScrollViewer.
This code gives you a 2x2 Grid :
A B
C D
The first element added is an horizontal ScrollViewer that span inside both A and C, this element is divided in two, the bottom part has a vertical ScrollViewer.
The elements in B and D are simple elements.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<ScrollViewer Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Image Grid.Row="0" Source="http://via.placeholder.com/1000x1000"/>
<ScrollViewer Grid.Row="1" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<Image Source="http://via.placeholder.com/1000x1000"/>
</ScrollViewer>
</Grid>
</ScrollViewer>
<Image Grid.Column="1" Grid.Row="0" Source="http://via.placeholder.com/1000x1000"/>
<Image Grid.Column="1" Grid.Row="1" Source="http://via.placeholder.com/1000x1000"/>
</Grid>
EDIT
Here's a new code to suit the requirements in your edit.
XAML
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<ScrollViewer x:Name="A" Grid.Column="0" Grid.Row="0" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Disabled" ScrollChanged="A_ScrollChanged">
<Image Stretch="None" Source="http://lorempixel.com/1000/1000/"/>
</ScrollViewer>
<ScrollViewer x:Name="B" Grid.Column="0" Grid.Row="1" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" ScrollChanged="B_ScrollChanged">
<Image Stretch="None" Source="http://lorempixel.com/1000/1000/"/>
</ScrollViewer>
<ScrollViewer x:Name="C" Grid.Column="1" Grid.Row="0" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Visible">
<Image Stretch="None" Source="http://lorempixel.com/1000/1000/"/>
</ScrollViewer>
<ScrollViewer x:Name="D" Grid.Column="1" Grid.Row="1" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Visible" ScrollChanged="D_ScrollChanged">
<Image Stretch="None" Source="http://lorempixel.com/1000/1000/"/>
</ScrollViewer>
</Grid>
Code behind
private void A_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
B.ScrollToHorizontalOffset(e.HorizontalOffset);
}
private void B_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
A.ScrollToHorizontalOffset(e.HorizontalOffset);
D.ScrollToVerticalOffset(e.VerticalOffset);
}
private void D_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
B.ScrollToVerticalOffset(e.VerticalOffset);
}