Using an IEnumerator without a foreach loop in order to simulate a state machine
You could make life slightly easier for yourself by using the iterator slightly more properly:

public override IEnumerator&lt;bool&gt; ExecuteEffect()
{
    if(delay &lt; 0 || GetRealTime() &gt; executionStart + delay)
    {
        DealDamage();
        yield break;
    }
    if(executionStart == -1m)
    {
        executionStart = GetRealTime();
    }
    yield return false;
}


Then you could actually use MoveNext 'correctly' as it will return false when you get to the end.

To be completely and brutally honest, I'd still rage erase all of this code if I found it in a project I worked on. Why is it an enumerator of booleans? None of it's particularly obvious.

As an aside:

if(temp.Current)
{
    return true;
}
else
{
    return false;
}


is 100% the same as

return temp.Current;