I think your problem is that you are using non-device tableaux in your script call from items. That, and to ensure troops get nothing but devices, you have to strip out all the non-device items from their equipment list in module_troops. That will, of course, affect other factions using the same troops.
The magic for devices all happens in tableaux and the scripts used there. Think of tableaux as Photoshop with texture files as layers. The set_banner scripts called from the item in VC simply find the device texture to use. It's script_process_shield_tableau that puts everything together:
Throw faction-indexed background color beneath:
(cur_tableau_set_background_color, ":background_color"),
After some very fine positioning and angling, add the device "sticker":
(store_add, ":arms_mesh", ":banner_index", arms_meshes_begin),
Layer over whatever mess the foregoing left on the back of the shield:
(init_position, pos1),
(position_set_x, pos1, -100),
(position_set_z, pos1, 10),
...
(cur_tableau_add_mesh_with_vertex_color, "mesh_white_bg_plane_a", pos1, 1000, 100, ":background_color"),
Layer on scratches, dents, rim, boss, etc.:
(init_position, pos1),
(position_set_z, pos1, 20),
(cur_tableau_add_mesh, ":surface_mesh", pos1, 0),
You would need to do something like this for each heraldic armor. You could try starting with just sticking the device on somewhere. Bear in mind, without a graphical interface, moving, scaling, and undistorting the device is an extremely painstaking process of: modify the source, recompile, and run the game to check output. I really hope they give us THIS in Bannerlord!
More ambitious would be to resurrect the custom armor system in the Native source. Taking our approach, the would require leaving "gaps" in the heraldic armor textures to be filled with the background color and additional texture layers for any foreground layers, plus the surface layer.