So Troy is testing out the mt api support that I built into the Silt server. For an idea as to what kind of fun this is, have a look at the results for a Google search on "mt API". Good luck finding anything useful - I had to dig into the Google cache for SixApart docs.
Anyway, in response to getCategoryList() I was sending back an array of structs, as requested - but I was letting the code fall through to the same API in metaweblog API. The difference is that the meta API sends back a number of key/value pairs in the dictionary, while MT only expects two - category id and name (and a third, isPrimary, for specific posts). Silly me - I thought extra dictionary entries would be ignored.
Not in the tool that Troy was testing though. So, I've got that fixed and uploading to the production server. Now to find out where my next misconception comes from.