Your code is not quite clear to me, but providing a data structure that looks like an array for a user and is not an array in implementation is quite easy:
internal struct Element {}
class ElementContainer {
internal Element Add(Element element) { return element; }
internal void AddRange(Element[] elements) {}
internal Element this[int index] { get { return GetElement; } }
#region implementation
Element GetElement(int index) {}
#endregion implementation
}
ElementContainer container = new ElementContainer();
container.Add();
contaner.AddRange();
Element myElement = container[3];
—SA