How do I copy the vertices, edges, and faces of one mesh into another?
One way is, as you are doing, Swapping the mesh 

ob1.data = mesh # assign mesh to ob1
ob1.data = mesh.copy() # assign a copy of the mesh to ob1


how to use another meshes verts, edges and polygons to pass to the mesh.from_pydata method.

cone = context.object # some other object
mymesh = bpy.data.meshes.new("mymesh")
vertices = [v.co for v in cone.data.vertices]
faces = [[v for v in p.vertices] for p in cone.data.polygons]
# let faces take care of edges
mymesh.from_pydata(vertices=vertices, edges=[], faces=faces)
# could make edges
edges = [[v for v in e.vertices] for e in cone.data.edges]


Using from_pydata isn't going to fix the shader issue.