You can think about using reflection:
class UserViewModel
{
[DisplayName("User name")]
public string UserName { get; set; }
[DisplayName("E-mail address")]
public string Email { get; set; }
[DisplayName("Age")]
public int Age { get; set; }
}
Then you can easily access properties through reflection and save selected property list in user settings. You can access display name through reflection too (it is not here):
var type = typeof(UserViewModel);
var properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
Console.WriteLine(property.Name);
}
You don't have to create additional types and description. Attributes give you display name and reflection gives you list. That is how ASP.NET MVC works. Similar mechanism is used when you want to use Html.EditorFor(Model) and many other in this framework.