The question has two parts that are related but not the same.. To answer second part first, now that we have the yield syntax, and the plethora (I love that word!) of built-in collection class options that you can derive from, you should very very rarely have to implement IEnumerator or IEnumerable yourself anymore. So, in the great majority of cases, a custom collection class should not implement IEnumerable and IEnumerator itself, it should derive from one of the existing built-in collection classes that already do that for you.
Secondly, to answer the first question, Why build such a custom collection class? in order to encapsulate logic/functionality that you wish to reuse in multiple places in client code, in a single place instead of having to repeat it everywhere. Say you have a need to represent collections of Invoices. List<Invoice>
will do it, but if you need only the overdue Invoices in two or three places in one module, and only the invoices for a a specified state in another module, and only a specific customer's invoices in a billing moodule, and let's say you need to find and extract a specific invoice by it's Invoice Number in several places in code. Well if all you have is List<Invoice>
all the functionality to do what I described would have to be repeated in every place in client code where you wanted to perform those functions... If you encapsulate this functionality in a custom collection class, you only write it once, and maintain it in one and only place, and access it from anywhere through the collection class methods on the instance...
public Invoices: List<Invoice>
{
// extra functionality as required
}