Small automated script
The result without calling operators.

import bpy

from bpy import context
# all mesh objects
meshobs = [o for o in context.selected_objects if o.type == 'MESH']
# black material (or None)
black = bpy.data.materials.get('BLACK')
# copy layer
copy_layer = 19
copy_layers = [i == copy_layer for i in range(20)] 
if black is None:
    print("WARNING: no black material")

scene = context.scene

for o in meshobs:
    # linked copy
    copy = o.copy()
    # new copy transforms constraint
    ct = copy.constraints.new('COPY_TRANSFORMS')
    # set target to original
    ct.target = o
    # loop thru material slots
    for slot in copy.material_slots:
        # object link
        slot.link = 'OBJECT'
        # set to black material
        if slot.material is None:
            slot.material = black

    # link to scene
    scene.objects.link(copy)
    # move to copy_layer (after linking to scene)
    copy.layers = copy_layers


It only sets existing slots with empty (slot.material is None) material to black.