I think the issue here is that the marker_color list needs to be wrapped in a second list.
return [{'marker.color': [marker_color]}];
The reason is that when an update operation receives a value that is a list, it applies one element to each trace. That’s why all of the points are being given the first color in the list. By wrapping an extra list around marker_color, the first element of the list is the marker_color list that you want.
Hope that helps,
-Jon