Вы можете написать метод GetEnumerator в любой структуре или классе, это позволит использовать конструкцию foreach.
Но есть несколько моментов, которые стоит понимать:
- Результат метода должен вернуть структуру или объект, в котором есть метод MoveNext и свойство Current;
- При использовании интерфейса IEnumerable (например, в List<>) при любом использовании foreach или GetEnumerator значение будет запаковано (boxing) и избежать этого уже никак не выйдет.