The thing I found difficult about dynamic-wind was that I had Scheme continuations as interpreter continuations (using a CPS interpreter). So there was no way for it to check on dynamic scopes or call procedures when calling a continuation. The next time around, I built dynamic-scope-handling into the (bytecode) interpreter, so it could add stuff to the execution at the point of changing scopes.
But, in any case, if you implement the lambda calculus directly, and write call/cc in the obvious way without thinking about dynamic-wind, dynamic-wind is impossible to add later. At least, I think that's true; I'm now not quite sure that you can't add "check for scope-changing hooks" to the front of continuations that call/cc generates. It'd still seem fragile to make call/cc responsible for making sure that dynamic-wind's contract isn't violated.
Re: Scheme in Haskell...
But, in any case, if you implement the lambda calculus directly, and write call/cc in the obvious way without thinking about dynamic-wind, dynamic-wind is impossible to add later. At least, I think that's true; I'm now not quite sure that you can't add "check for scope-changing hooks" to the front of continuations that call/cc generates. It'd still seem fragile to make call/cc responsible for making sure that dynamic-wind's contract isn't violated.