@dhaulagiri ChangeDetector does accept a parameter:
Try creating the parameter in the ChangeDetector and then link that to your python parameter.
AttributeExposer will not accept a dynamic list of attributes because it's an 'authoring' tool and adds attributes to the workbench schema. Adding attributes in AttributeExposer will add attributes down stream, like AttributeManager, which can't be done dynamically. In most cases, just because attributes are not exposed in the workbench schema, they are still on the features and will be written out.
@Mark Stoakes , you have unlocked the situation, thank you! This solution works perfectly. I was candid in thinking that it was enough for the parameter to simply return a string formatted like what you see when you just select attributes. It's apparently a bit more than that!
For AttributeExposer, I wrote too quickly: it is correct that it is different. Actually, I meant CRCCalculator, which is also right next to it in my workbench. Whoops.
I retain that it is preferable to create the user parameter directly in the transformer which uses it.