I think it's got something to do with you inserting a tuple element into the listbox rather than one or more strings. Try this instead:
listbox.insert(END, ' '.join([i]+dic[i])
which concatenates the key and all the sub-elements together into a single string -- which also keeps them all on one line -- and inserts that single thing into the listbox. Here's what it looks like on my system after pushing the button:

The other alternative would be to unpack the tuple in the call:
listbox.insert(END, *(i, dic[i][0], dic[i][1], dic[i][2]))
or, better yet, not put them in a tuple in the first place:
listbox.insert(END, i, dic[i][0], dic[i][1], dic[i][2])
But even better than that, because it would be able to handle lists of any length (as pointed out by @mgilson in the comments) would be to write it this way:
listbox.insert(END, i, *dic[i])
Regardless, the result would look like this:

Here's a way to do things so the listbox will automatically update its width after it's updated. It also shows another way to build the dictionary and later iterate through its contents when populating the listbox:
from Tkinter import *
def update_listbox():
longest = 20 # initial value acts as minimum width
for key,value in dic.iteritems():
entry = '{}: {}'.format(key, (', '.join(value)))
longest = max(longest, len(entry))
listbox.insert(END, entry)
listbox.config(width=longest) # width in "standard" or average characters
dic = {
'Foods': ['apple','grape','pizza'],
'Drinks': ['milk','soda','juice'],
}
root=Tk()
root.title('Listbox')
listbox = Listbox(root)
button = Button(root, text='push', command=update_listbox)
button.pack()
listbox.pack()
root.mainloop()
With this result:

BTW, here's a good online Tkinter reference.