沒(有) is a flat denial — it just isn't done. 還沒(有) keeps that denial running up to now and leans forward to the change still owed: 沒吃 (didn't eat) vs 還沒吃 (haven't eaten yet — about to). Drop 還 and you lose the 'yet, still waiting' lean.
還沒(有) denies a completion that is still pending (還沒到 = hasn't arrived yet). 還不 denies a will or quality that still holds (還不想 = still doesn't want to). 沒 faces the not-yet-done record; 不 faces the standing intention.
了2 reports the change has landed (來了 = has come now). 還沒(有) is its mirror before the line: the change has not landed yet, but is owed. They name the two sides of the same threshold.
adding 了 under 沒: 我還沒吃了 → 我還沒吃
negating the not-yet with 不: 我還不吃飯(=still won't eat) → 我還沒吃飯 (still haven't eaten yet)
dropping 還 when the act is still expected: 火車還沒到 not 火車沒到, when it is on its way
English 'not yet / still haven't' folds the 'still' into the verb's tense; learners drop 還 and say 沒, losing the pending 'any moment now' reading. English 'still' before a negative also tempts 還不, which switches it to a standing refusal.