The main cause was the crew attempting a stall manoever at low level
I don't think the low level had anything to do with the accident. If you read the report, they basically recovered from the first stall due to low speed but then stalled again due to trim against the end stops. Even if they had been at the correct altitude, I don't see a different outcome. A nose up stall with power on and trim at max is still going to fall out of the sky pretty quickly.
The example FDs in the report are very enlightening, whilst they initially had a warning of the need to use manual trim, the warning vanished due to the Airbus changing Flight Laws.
To my mind the causes were:
1) Washing it in an unapproved method - missing covers and with a fire hose.
2) Failure to follow the SOP for the manoeuvre - crew didn't calculate speeds that the protection should activate at and aborted when it didn't activate.
3) Failure to manage the trim in the stall recovery - crew didn't check it during the stall recovery, and whilst the FD had warned earlier that manual trim was required it vanished from the FD at the time of greatest need.
Yes there was other naughtiness going on about flight testing without officially informing ATC and doing the test at the wrong level, but I don't think those actively contributed to the accident.