I would say, do not split the dataset, If I merge your list I can do something like this
library(tidyverse)
datalist <- list(structure(list(O = c(3, 4, 4, 3, 2), G = c("A", "A", "A",
"A", "A")), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -5L), spec = structure(list(cols = list(
O = structure(list(), class = c("collector_double", "collector"
)), G = structure(list(), class = c("collector_character",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1L), class = "col_spec")), structure(list(
O = c(5, 5, 6, 7, 4), G = c("B", "B", "B", "B", "B")), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -5L), spec = structure(list(
cols = list(O = structure(list(), class = c("collector_double",
"collector")), G = structure(list(), class = c("collector_character",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1L), class = "col_spec")))
datalist %>%
map_dfr(~.) %>%
ggplot(aes(x = O, fill = G)) +
geom_histogram(position = "dodge")
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Created on 2021-03-28 by the reprex package (v1.0.0.9002)