It is not the UserControl, nor the GridView where you define what your data items will look like, so you can easily display items from different classes in one UserControl. Instead, you define how each class should be rendered by declaring DataTemplates:
<DataTemplate DataType="{x:Type YourPrefix:foo}">
<StackPanel>
<TextBlock Grid.Row="0" Text="{Binding age}" />
<TextBlock Grid.Row="1" Text="{Binding name}" />
</StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type YourPrefix:bar}">
<StackPanel>
<TextBlock Grid.Row="0" Text="{Binding kind}" />
<TextBlock Grid.Row="1" Text="{Binding length}" />
</StackPanel>
</DataTemplate>
Of course, you'd need to use a collection of type object if you want to be able to put different types of objects in it:
public ObservableCollection<object> Items { get; set; }
...
Items = GetFoos();
// Or Items = GetBars();
...
<ListBox ItemsSource="{Binding Items}" />
Reading the Data Templating Overview page on MSDN should help you understand this all better. However, I wouldn't recommend this approach as you'd continually have to cast objects back to their proper types. You're much better off declaring different UserControls for each data type being displayed or edited.