Q: MVC Complex model binding to list by index could really use another set of eyes here, what am i doing wrong?
Model:
public class reqView {
    public string Name { get; set; }
    /* Loads of properties */
    private lsAddress _addresses = new lsAddress {
        new Address { id = 1 }, new Address { id = 2 }
    };
    public lsAddress lsAddress {
        get { return _addresses; }
        set { _addresses = value; }
    }
}

View:
@Html.DropDownListFor(model => model.lsAddress[1].addrCC,
                        new SelectList(CacheConfig.Countries.Where(c => c.dix.Contains(Model.dix)), "id", "text", Model.lsAddress[1].addrCC),
                        new {@class = "form-control"} as object);

Controller:
public ActionResult Index() {
        var model = (reqView) TempData["reqView"];

        if (model == null) model = new reqView();

        TempData["reqView"] = model;

        return View(model);
    }

lsAddress:
public class lsAddress : List<Address>, IEnumerable<SqlDataRecord>{
    IEnumerator<SqlDataRecord> IEnumerable<SqlDataRecord>.GetEnumerator()
    {
        var sqlRow = new SqlDataRecord(
            new SqlMetaData("id", System.Data.SqlDbType.TinyInt, false, true, SortOrder.Unspecified, -1),
            new SqlMetaData("nmContact", System.Data.SqlDbType.NVarChar, 80)
            );

        foreach (Address obj in this)
        {
            sqlRow.SetValue(0, obj.id);
            sqlRow.SetValue(1, obj.cName);
            yield return sqlRow;
        }
    }
}  

To Replicate:
see the .net fiddle
select 1 then 2 -> Index out of range
select 2 then 1 -> Object reference not set to an instance of an object.
What am i missing here?

A: Problem here: how binding model properties on submit.
1) you init _addresses in constructor, so if on submit you not pass values for this properties, this would be by default: list with two elements.
that's why all work when you submit from your 0 variant: you set disabled attribute to select, and on submit this value not sended.
2) when you do submit from '1': select - enabled, and have name that mapped to first element of _addresses, so MVC see that from request come field, and replace list with to element, that was created in constructor, to list with on element, which come from request.
that's why your 1 work, but if you see what he send on submit - you see that is model where _addresses is list with one element. And that's why you have error when go from 1 to 2 - you just send list with one element, but in view try get value from element with index=1 instead 0.
3) when you do submit from 2: select also enabled and have name that mapped to first element of _addresses, but MVC can't create correct list from one element with index that not 0 and if you see what come in post method, you can see that _addresses come null.
for solution you can add hidden field, that would be save value for other list items:
@{var cur = -1;}
@switch (Model.dix)
{
    case 0:
        @Html.DropDownListFor(model => model.lsAddress[0].addrCC,
                new SelectList(mvc.Controllers.CacheConfig.Countries.Where(c => c.dix.Contains(Model.dix)), "id", "text", Model.lsAddress[0].addrCC),
                new { @class = "form-control", disabled = "disabled" } as object)
        break;
    case 1:
    @Html.DropDownListFor(model => model.lsAddress[0].addrCC,
                new SelectList(mvc.Controllers.CacheConfig.Countries.Where(c => c.dix.Contains(Model.dix)), "id", "text", Model.lsAddress[0].addrCC),
                new { @class = "form-control" } as object);
    cur = 0;                    
    break;
    case 2:
    @Html.DropDownListFor(model => model.lsAddress[1].addrCC,
                new SelectList(mvc.Controllers.CacheConfig.Countries.Where(c => c.dix.Contains(Model.dix)), "id", "text", Model.lsAddress[1].addrCC),
                new { @class = "form-control" } as object);
    cur = 1;
        break;
}
@for (int i = 0; i < Model.lsAddress.Count; i++)
{
    if (i == cur) { continue; }
    @Html.HiddenFor(model => model.lsAddress[i].addrCC)
}

DotNetFiddle
