Html.DropDownListFor confusão

Alguém por favor pode me ajudar a entender como funciona o Html.DropDownListFor? Eu tenho um modelo que é o seguinte

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

A chamada para DropDownListFor que parece

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

Com essa configuração, acho que a lista suspensa é preenchida corretamente, no entanto, após o envio do formulário, não consigo obter o item selecionado. Também pelo que li a chamada para Html.DropDownListFor, na verdade, deve parecer

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

De fato, outras partes do código também se parecem com isso, mas quando faço isso, a lista suspensa não está sendo preenchida. Estou faltando alguma coisa aqui?

Algumas anotações: 1) A população desse menu suspenso ocorre após a seleção de um valor de outro menu suspenso; portanto, faço uma chamada AJAX chamando getJSON para obter dados do banco de dados 2) O aplicativo é um aplicativo MVC

Gostaria de receber qualquer ajuda oferecida. Entre em contato se precisar de outras informações para ajudar a responder a esta pergunta

Edit: Aqui estão mais alguns detalhes

Este é o método de ação no controlador usado para recuperar os dados para o menu suspenso

[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);
    }

E esta é a chamada JQuery para a ação no 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
                            }));
                        });
                    }
                });
    });

É esse loop $ .each que não é inserido quando uso model => model.Product mesmo que os dados sejam retornados nos dados variáveis