I like the idea about the dynamic __call implementation. The only hickup is, that leave all the error validation to XBMC - but this can also be considered a feature.
You're indenting is a little of at times, mixing tabs with spaces perhaps?
Why do you always pass the url along and create a new XBMCJsonRPC instance on each request? You could also use dependency-injection because you already have one from the beginning.
Not very important, but you could call the parent constructor instead of setting the url manually.
Maybe subclass Exception to provide the possibility to specifically catch your errors?
Your naming-scheme is very inconsistent. Sometimes you have abbreviations all-uppercase,s ometimes all-lowercase. Consider each abbreviation to be a single word: XbmcJsonCommand - I think this makes it much more easy to read, and it's also consistent.
You didn't set the visibility for $url in your first class.
Update
Code:
$this->remoteCommands = $this->rpc("JSONRPC.Introspect")->commands;
Does not belong into the constructor, it also doesn't desever a dedicated member variable, because you only use it in populateCommands.
Instead, make a local variable in populateCommands.
Code:
if(!class_exists($rpcCommand[0])) {
Are you sure that this is needed? I guess it means that PHP does not allow for a member variable to have the same name as an existing class? (Edit: You don't need it, see
here)
Anyway, if you would like to keep naming even more consistent, you could also use
lcfirst() on $rpcCommand[0] (and it's a shame PHP can't cope with the array access operator on a function call.)