Когда вы сталкиваетесь с добавлением элементов в код, обычно есть лучший способ.
Как насчет создания ListBox и установки его ItemsSource в ваш список (или связывания его с DataContext). Создайте DataTemplate для отображения миниатюры и информации, а затем (это важная часть) создайте ItemsPanelTemplate с помощью WrapPanel.
<Grid x:Name="ImageThumbnails">
<ListBox
ItemsSource="{Binding}"
Width="950"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<Image Source="{Binding Thumbnail}" Width="80" Height="60"/>
<TextBlock Text="{Binding ImageName}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
</Grid>
Затем в вашем коде, как только вы получите данные из вашего вызова JSON:
this.ImageThumbnails.DataContext = thumbnailListFromJSON;
Теперь, если ваш список - это ObservableCollection, любые изменения в списке будут автоматически отражены в вашем пользовательском интерфейсе.
(Приведенный выше код следует рассматривать как псевдокод - очевидно, вам придется изменить его, чтобы он отражал вашу структуру данных)
Редактировать: добавлен ScrollViewer.HorizontScrollBarVisibility = "Отключено" в ListBox. Это важно, потому что останавливает бесконечно расширяющийся просмотрщик в горизонтальном направлении. Без этого WrapPanel становится списком из 1 строки.