For DREAD IT's cameras, I implemented them as a per-scene class containing transform information that's applied at render time, baked directly into the shader.
The cameras support movement, zooming, rotation, and shaking, and can be inherited to implement unique "behavior" code for different scenes.
This implementation worked very well for us, since we had the GUI and menus implemented as separate scenes that rendered on top of the game scene
To reduce redundant calculations, the camera also only calculates its transform matrix if its data has changed since the last time it was retrieved.
For the camera shake, users can specify a magnitude and decay rate for shakes of different sizes and durations.
The camera then oscillates at slightly different frequencies on the x and y axis, which gives it a random appearance while still moving smoothly.
On my last project, where I also implemented custom cameras, I used an exponential decay for the camera shake, but this time I found that a linear decay was more predictable, smoother, and scaled better with delta time.
For ease of use, the Scene Camera base class contains logic to be panned and zoomed by mouse controls while using the editor. This was a relatively small task, but it made developing the game using the editor significantly easier.