В зависимости от используемых вами связующих, это должно работать:
<%var i = 0;
foreach (var product (IList<ProductSelection>)ViewData["products"]) {%>
<%=Html.Hidden(string.Format("products[{0}].Id", i), product.Id)%>
<%=Html.Checkbox(string.Format("products[{0}].Selected", i))%>
<%=product.Name%><br/>
<%}%>
... что приведет к HTML примерно так (обратите внимание на обозначение массива в именах):
<input name="products[0].Id" type="hidden" value="123">
<input name="products[0].Selected" type="checkbox">
Widget
<input name="products[1].Id" type="hidden" value="987">
<input name="products[1].Selected" type="checkbox">
Gadget
... и метод контроллера, который обрабатывает сообщение:
public ActionResult SelectProducts(IList<ProductSelection> products)
{
...
}
При связывании параметр products будет содержать два экземпляра ProductSelection.
Одно предостережение: я не использовал новую привязку по умолчанию для сложных объектов. Скорее я использую или NameValueDeserializer или CastleBind, оба из MvcContrib. Они оба ведут себя так. Я предполагаю, что привязка в бета-версии будет работать так же.