Typically you set the combo's DataSource to the list, the DisplayMember to a string of the name of the property to display and the ValueMember to a string of the name of the property to use as the value (when calling for selectedValue):
public class Person{
public string Name { get; set; }
public int Id { get; set; }
}
var peeps = new List<Person>(){
new Person(){ Name="John",Id=1 },
new Person(){ Name="Jane",Id=2 }
};
combo.DataSource = peeps;
combo.DisplayMember = "Name";
combo.ValueMember = "Id";
Chose "Jane" in the combo, and (int)combo.SelectedValue
will be 2
If you don't set the display and value members, the combo will just call ToString on every item in the list and use it as the display text, and the whole object as the value. Without an overridden ToString the default is just to return the type Name. You're hence probably seeing a list full of "YourNamespace.Person" or equivalent