Hi Max,
The main reason why jOOQ prefers arrays over lists in such cases is the fact that the array component type is not erased at runtime. Quite a bit of jOOQ's internals depends on being able to reflect on the type of a column, and in case of arrays, the component type of the array.
Obviously, if you write your own, specific data type binding per array type, you do not have this limitation.
Whether you're using the code generator or not is not important here. You will need to use the same mechanisms manually, instead of automating the task using code generation. Since you're using the internal APIs (like createField()), I do recommend again to use the code generator as little is gained from not doing so. In this case, you'd attach your data type binding using a <forcedType/> configuration.
There is a createField() overload where you can pass your Binding<String[], ArrayList<String>> implementation. You will simply need to use that overload instead of the one you were using, and you're set.
I will be very happy to help you with additional specific questions you may have.
Best Regards,
Lukas