Another option is merged.stack
from splitstackshape
library(splitstackshape)
res <- merged.stack(DF, var.stubs=c('Name', 'Price'), sep='var.stubs',
atStart=FALSE)[,2:= NULL][]
setnames(res, 2, 'Seller')
res
# ProductID Seller Price
#1: 1 A $1
#2: 1 X $3
#3: 2 B $3
#4: 2 Y $6
#5: 3 C $2
#6: 3 Z $1