Html.DropDownListPara confusión

¿Puede alguien ayudarme a entender cómo funciona el Html.DropDownListFor? Tengo un modelo que es el siguiente

public class TestModel
{
    public IList<SelectListItem> ProductNames { get; set; }
    public string Product { get; set; }
}

La llamada a DropDownListFor que se parece a

@Html.DropDownListFor(model => model.ProductNames,  Model.ProductNames, "Select a Product", new {@class="selectproductname" })

Con esta configuración, encuentro que la lista desplegable se llena correctamente, sin embargo, después de enviar el formulario, parece que no puedo obtener el elemento seleccionado. También por lo que he leído, la llamada a Html.DropDownListFor debería verse realmente

@Html.DropDownListFor(model => model.Product,  Model.ProductNames, "Select a Product", new {@class="selectproductname" })

De hecho, otras partes del código también se ven así, pero cuando hago esto, la lista desplegable no se completa. ¿Me estoy perdiendo de algo?

Un par de notas al margen: 1) La población de este menú desplegable ocurre después de seleccionar un valor de otro menú desplegable, por lo que hago una llamada AJAX llamando a getJSON para obtener datos de la base de datos 2) La aplicación es una aplicación MVC

Agradecería cualquier ayuda ofrecida. Avíseme si necesita alguna otra información para ayudar a responder esta pregunta

Editar: Aquí hay algunos detalles más

Este es el método de acción en el controlador utilizado para recuperar los datos para el menú desplegable

[AcceptVerbs(HttpVerbs.Get)]
    public JsonResult LoadProductsBySupplier(string parentId)
    {
        var ctgy = this._categoryService.GetAllCategoriesByParentCategoryId(Convert.ToInt32(parentId));
        List<int> ctgyIds = new List<int>();

        foreach (Category c in ctgy)
        {
            ctgyIds.Add(c.Id);
        }

        var prods = this._productService.SearchProducts(categoryIds: ctgyIds, storeId: _storeContext.CurrentStore.Id, orderBy: ProductSortingEnum.NameAsc);

        products = prods.Select(m => new SelectListItem()
        {
            Value = m.Id.ToString(),
            Text = m.Name.Substring(m.Name.IndexOf(' ') + 1)
        });

        var p = products.ToList();
        p.Insert(0, new SelectListItem() { Value = "0", Text = "Select A Product" });
        products = p.AsEnumerable();
        //model.ProductNames = products.ToList();


        return Json(products, JsonRequestBehavior.AllowGet);
    }

Y esta es la llamada JQuery a la acción en el controlador

$("#Supplier").change(function () {
        var pID = $(this).val();            
        $.getJSON("CoaLookup/LoadProductsBySupplier", { parentId: pID },
                function (data) {
                    var select = $("#ProductNames");
                    select.empty();
                    if (pID != "0") {
                        $.each(data, function (index, itemData) {
                            select.append($('<option/>', {
                                value: itemData.Value,
                                text: itemData.Text
                            }));
                        });
                    }
                });
    });

Es este ciclo $ .each que no se ingresa cuando uso model => model.Product aunque los datos se devuelven en los datos variables

Respuestas a la pregunta(2)

Su respuesta a la pregunta