Former game engine dev and for a long while, proprietary engine programmer here....
Crytek focused too much on pretty graphics and not enough on anything else that is important to the larger experience of developing a game. Shiny graphics and cool fringe features are nice, but an engine is supposed to help you get a game done faster and without reinventing wheels.
Building an engine to be the wheels for other people is hard. Most of the time you build an engine, you make it work well for a specific game or subset of games you make. It seems like everything in an engine should be and can be generic, but that's not really true. Once you try to make things super generic, you start to make tons of sacrifices either for the sake of makings things easier or at least repeatable. The issue is that as you move farther towards abstractions away from the original problems, you complicate everything and the end result is actually often less productivity (more steps, more hoops, etc), less performance, or even having to drop features altogether. Specialization is often looked at as something terrible in programming by some people (my code should be reusable!), but it really can make a huge difference in performance and features-specific contexts like games.
There's also a difference as well between building an engine for yourself and selling one. If anything, I'd argue that Crytek may have done a pretty OK job for the former, but egregiously failed doing the latter.
If you're selling an expensive game engine, you need to do at least some of the following:
* Provide reasonably understandable source
* Offer good support, especially in English
* Stable, highly adaptable tooling
* Wide support of popular formats
* Clean, adaptable, fast asset pipeline
* Community support and interaction
* Cross-platform tooling/compilation options
* Integration points for custom code, middleware, etc.
* Ability to patch/fork the engine itself within reason when needed
* Avoid huge amounts of allocations
* Use fast or safe allocators or provide the ability to do so
* Provide useful feedback during debugging, logging, tracing
* Plug-in system/replaceable parts
* Offer a scripting language and/or support for popular ones
* Tools to prototype quickly if necessary
* Create one or more games that is understandable to demonstrate features, but is still comprehensible
* Support modern asset formats
* Provide decent, predictable, hardware support
* Ensure a stable experience
I'll let the reader interpret which of those CryEngine does wrong.
Some versions of CryEngine actually do some of these things well, but the problem is that relative to other options like Unreal, everyone I know has found it hard to justify buying or using CryEngine going forward. CryEngine in terms of raw features often looks attractive and awesome. Most people I've known including myself have had issues arise once you try to build something real with it. Quite often things just don't work how they should or are incredibly quirky. There's always tons of things promised that will be "fixed" or "redone" and never get done in a reasonable amount of time.
Just look at the Star Citizen situation. Hiring former CryEngine devs really helped the project they say, and that's not just because those people are awesome developers, it is because they understand the crazy quirks that most people who didn't work with that code every day don't and in some cases never will.
The game engine market isn't an easy one, but frankly they brought this on themselves.