Although using dynamic features of C# is fun, it is not needed in this case. Good old fashioned databinding is powerful enough to do what we want. For example. Here is some XAML that binds an ItemsControl
to a collection with a RadioButton
template:
<Grid>
<StackPanel>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<RadioButton
GroupName="Value"
Content="{Binding Description}"
IsChecked="{Binding IsChecked, Mode=TwoWay}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock Text="{Binding SelectedItem}"/>
</StackPanel>
</Grid>
And here is how you use it in the code-behind or from a view-model:
DataContext = new CheckBoxValueCollection(new[] { "Foo", "Bar", "Baz" });
Now all you need is the collection to make it work. Here is the collection of check box values:
public class CheckBoxValueCollection : ObservableCollection<CheckBoxValue>
{
public CheckBoxValueCollection(IEnumerable<string> values)
{
foreach (var value in values)
{
var checkBoxValue = new CheckBoxValue { Description = value };
checkBoxValue.PropertyChanged += (s, e) => OnPropertyChanged(new PropertyChangedEventArgs("SelectedItem"));
this.Add(checkBoxValue);
}
this[0].IsChecked = true;
}
public string SelectedItem
{
get { return this.First(item => item.IsChecked).Description; }
}
}
And here are the check box values themselves:
public class CheckBoxValue : INotifyPropertyChanged
{
private string description;
private bool isChecked;
public string Description
{
get { return description; }
set { description = value; OnPropertyChanged("Description"); }
}
public bool IsChecked
{
get { return isChecked; }
set { isChecked = value; OnPropertyChanged("IsChecked"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
Now you have a completely dynamic data-driven and databinding-friendly radio button design.
Here is what the sample program looks like:

The text below the radios shows the currently selected item. Although in this example I've used strings, you can easily change the design to use enum
values or other sources for the radio button description.