Either declare this.items as a List<IType> if you want to expose it as ICollection<IType> and thus allowing external callers to add ITypes that are not MyTypes.
Internally work like this on the items of the list
var myObj = this.items[i] as MyType; if (myObj == null) { work with this.items[i] and treat it as a IType } else { work with myObj which is a MyType }
OR
declare the public property as
public ICollection<MyType> Items { get return this.items; } }
and thus allow external callers to add only items of type MyType.
I am sorry, but you cannot fulfill conditions (2) and (3) at the same time
UPDATE
Another option is to only allow external callers to get items of the list but not to add items, by using an indexer having only a getter.
public IType this[int i] { get { return this.items[i]; } }
an external caller can then access items like this
var obj = new ClassImplementingThisStuff(); int i = 5; IType x = obj[i];
Also add a count property
public int Count { get { return this items.Count; } }
This solution avoids unnecessary enumeration.