You can solve both problems by using an alternative way of addressing a column:
for(i in 1:length(my_list)) my_list[[i]]$names <- names(my_list)[i]
Or, avoiding a loop (more idiomatic R, IMHO):
lapply(names(my_list), function (n) cbind(my_list[[n]], names = n))
Incidentally, plyr
isn’t needed here, the same effect can be achieved via
do.call(rbind, my_list)