You may need to declare a transport method (for the underlying JGroups lib) which should suit the network where you have your Infinispan nodes deployed.
With XML it's done like this, by pointing Infinispan to a suitable JGroups config file, here for UDP:
<stack-file name="jgroups-config" path="default-configs/default-jgroups-udp.xml"/>
As a cache that is configured in domain.xml works, I think JGroups is configured correctly.
Also the session replication works via UPD protocol.
Here is the relevant configuration from domain.xml:
<channel name="ee" stack="udp"/>
<transport type="UDP" socket-binding="jgroups-udp"/>
<protocol type="FD_SOCK" socket-binding="jgroups-udp-fd"/>
As I understand it, if there is no default stack, the udp stack from "ee" chanel is used.
One possible reason this doesn't work is that only one node knows about newly created cache. The configuration change is done by you programatically and it's not propagated to the rest of the servers.
The only way this might work (I'm not entirely sure but it won't hurt to try it out) is to deploy the app on all servers in the domain. This way the configuration should be in sync and replication should work. However you might get into troubles when undeploying/redeploying your app.
In Hot Rod Server we implemented our own version of ispn-cli.sh script which allows to create caches on the fly. It's much better solution but it would require having a separate cluster only for Infinispan. This would be a suggested solution.