[eluser]apodner[/eluser]
I would agree that technically you can put multiple classes in the same file and your code will work as intended. However over the long term, you may want to avoid that if you can. Typically, you want to have one class per file to promote maintainability and readability.
CI is heavily object oriented in its design. If you think about it, every call you make to display a view or interact with a model is done so in an object oriented way. $CI or ($this) itself is a huge object.
I do agree though, that the some of the more advanced constructs of OOP are not natively available in CI, and it takes a little work to get them up and running. I think one of the limiting factors is the lack of a native autoloader. The bottom line is that no framework is a one-size fits all solution. A framework is a tool, and as the axiom goes, "you have to have the right tool for the job".
It may be that CI is not the right fit for your particular application requirements. I think it is always important to know what a particular framework is best suited, and what it isn't. However, one nice thing about CI is that it is pretty easy to extend core functionality if you really want to use it, but there is just something it doesn't do out of the box.