Первый вопрос, который приходит на ум, это когда вы будете добавлять строки. Это чисто дизайнерское время? или это требование времени выполнения?
<Grid x:Name="ExampleGrid" Height="20" Width="200">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Text="Text One" Height="Auto" Grid.Row="0"/>
<TextBlock Text="Text Two" Height="Auto" Grid.Row="1"/>
<TextBlock Text="Text Three" Height="Auto" Grid.Row="2"/>
</Grid>
Это создаст трехрядную сетку. При этом каждая сетка получает равную долю доступного пространства. (звезда по высоте означает разделенное доступное пространство)
Если бы вы добавили строку во время выполнения.
ExampleGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });
TextBlock block = new TextBlock() { Text = "Text Four" };
Grid.SetRow(block, 3);
ExampleGrid.Children.Add(block);
Проблема заключается в том, что сам текст должен увеличиваться или уменьшаться в соответствии с доступным пространством, и я не уверен, как это сделать.