There are no hard and fast rules for creating more than 1 program object... It is just a matter of convenience.
Once the kernel objects are created, it really does not matter which program object it came from... You can just set the args and fire up the kernels...
If you are using many 3rd party OpenCL libraries, then each one might create its own program on a user-supplied context....
As I said before, it is just a matter of convenience...There is no need to look at this so hard. There is nothing there.. It is an "upto the programmer and the application" thing...