Should versioning information be part of the header (versioning as general part of service routing/location) or the body part (versioning as service specific internal feature) ?
That depends on whether you want to handle it at the application level or as part of the infrastructure.
By the time you get to the on-the-wire message format (with headers, context and body), you'll have translated any logical way in which to reference the service (e.g., "JBoss UDDI") to a physical representation (e.g., http://www.jboss.com/services/durable?UDDI, plus some additional information as mandated by WS-Addressing). If you want the infrastructure to handle the versioning of services, then it will have interceded by this point and ensured that the physical endpoint reference (EPR) points to the right version. Hence, it'll be handled transparently to the message and implicitly within the header.
Now you could handle versioning yourself. Have the same EPR for services indirect to other services on a per message basis: think multiplexing and demultiplexing. In which case, one way you could do this would be to encode some version information within the body, or you could handle this in some other way, outside of the ESB, e.g., by having users of services register their endpoints with your demultiplexer and it switches between real service EPRs based purely on the wsa:From field (so again, it'd be in the header).
Hope this helps.