There are different approaches on how to solve this problem. I post this answer because I was dealing with a similar situation and found a decent solution. A DataGridView must be placed on your formular, the rest (in this example) is done in code.
First of all we start with our DataSource for the DataGridView.
DataTable myData = new DataTable();
myDataGridView.AutoGenerateColumns = false;
It´s important to turn off the auto generation, so we can set up the columns as we want. Now add some data to our DataTable . In this example cats:
myData.Columns.Add("Name", typeof(string));
myData.Columns.Add("Gender", typeof(string));
myData.Rows.Add(new object[] {"Ser Pounce", "male"});
myData.Rows.Add(new object[] {"Fluffy", "male"});
myData.Rows.Add(new object[] {"Peach", "female"});
After we have specified the Data and its columns we can create the specific columns in our DataGridView.
DataGridViewTextBoxColumn nameColumn = new DataGridViewTextBoxColumn();
nameColumn.HeaderText = "Cat name";
nameColumn.DataPropertyName = "Name";
nameColumn.ReadOnly = true;
DataGridViewComboBoxColumn genderColumn = new DataGridViewComboBoxColumn ();
List<string> genderList = new List<string>() { "male", "female", "unknown" };
genderColumn.DataSource = genderList;
genderColumn.HeaderText = "Gender";
genderColumn.DataPropertyName = "Gender";
genderColumn.ValueType = typeof(string);
myDataGridView.DataSource = myData;
myDataGridView.Columns.AddRange(nameColumn, genderColumn);
Add our Data as DataSource for the DataGridView before adding the defined columns. Note that the DataPropertyName of each column (DataGridView) has to be the same as the name we gave the columns in our DataTable. HeaderText can be named differently. Lastly match the ValueType of the column and data.