なんか勘違いしていると思われ。Cloneされるのはclassのインスタンスで、interface
なんざ、クローンしようがない。
だから、
q = (IEnumerator)p.Clone();
で十分じゃないの?
そもそも
class X : IEnumerator {
...
}
X p = new X();
X q = (X)p.Clone();
foreach (Y y in q) {
 ...
}
でいいんじゃないかい?