As an example of why you can't do this, imagine that in addition to FooModel and FooModelItem, you had BarModelItem. Now let's say you do this:
IModel fooModel = new FooModel();
IModel iModel = fooModel;
iModel.Items = new List(new BarModelItem());
FooModelItem fooModelItem = fooModel.Items.First();
If this was valid code, you'd be in trouble, because the item you'd get back in the last line would not in fact be a FooModelItem but a BarModelItem!
If you read each line carefully, you will see that the only possible wrong line is the second one. This demonstrates why an IModel can't be assigned to an IModel, even though FooModelItem : IModelItem. Not being able to do that assignment is exactly why your method call fails.
You can look into generic covariance and contravariance to see how this can be avoided in some cases, though it won't help in your particular situation without modifying your model.