If you go with a plugin datasource, you can use Featurelayers to display your data, so all the tools (except for editing tools) that work with featurelayers will work a featurelayer that uses your plugin. (Attribute tables, Identify, Data export etc.)
If use of these OOTB featurelayer tools is not important, I'd go with a inheriting BaseCustomLayer.
Another option might be inheriting from FeaturelayerClass, I played around with this a bit and have seen threads of others doing this too, but I've never thoroughly tested it.