If you for some reason don't know the value
at the time you are creating the item for it, just assign
the right value to item->data later, pass it to
g_object_add_weak_pointer(), or whatever.
However I don't understand why you can't do just this:
p = some_object_new();
item = g_list_append(NULL, p);
g_object_add_weak_pointer(p, &item->data);
list = g_list_concat(item, list);
/* or g_list_concat(l, i), but that's inefficient, it's
* better to construct the list in reverse order and then
* do g_list_reverse() */
However, if the data structures do not change (or seldom
change) after construction, it would not use lists, they
bring no advantage in this case and they have bad data
locality, pointer arrays would be better.