The problem with XMPP is fragmentation. The core protocol is an IETF standard, but it's very minimal (messages, presence notifications, basically nothing else, including how clients authenticate with servers). Everything else is handled via XEPs and for every feature there are 3-4 XEPs describing incompatible ways of providing it. Google did a pretty good job with Jingle, which provided file transfer and a way of setting up streams to use for video / voice, but clients all implement different file transfer mechanisms. I don't think I found a single pair of Android XMPP clients that could exchange files, for example. There are multiple mechanisms for publishing avatars. The last time I looked, the most widely supported one was vcard-temp, which involves setting an base64-encoded image in an XML encoding of a vcard that you publish inside your presence stanzas. This XEP was deprecated as soon as it was published because it had a bunch of well-known problems and was intended as a temporary stop-gap. The replacement was built on top of PEP (personal eventing via PubSub) which was, in turn, built on top of PubSub. The PubSub XEP is fiendishly complicated to implement and PEP adds even more complexity, so it was years between the standard being published and any clients or servers properly supporting it.
This last point really highlights the problem with the XMPP standards process. The IETF requires two interoperable implementations for an RFC to advance. The XMPP Foundation happily publishes standards-track XEPs with zero implementations. They never produced a reference implementation of a client library. Some newer open IM standards have learned from this mistake. For example, Tox provides a client library that is used by multiple clients and serves as a reference implementation. Unfortunately, it's not GPLv3, so anyone wanting to implement a non-GPL Tox client must reimplement the protocol (it's still better than no reference implementation though, and providing an incentive to implement a second client library may be good for the protocol in the long term).