Dijkstra assumes once you process a node, you have found its shortest path. That assumption breaks with negative edges because a later path can improve an already-processed distance. Consider a graph: (weight ), (weight ), (weight ). Dijkstra processes first with distance , marks it as final, and never checks the better path with total cost .
The greedy choice fails because processing nodes by current distance does not account for future improvements through negative edges. You need an algorithm that checks all possible paths, not the locally best ones.