I did this about 30 years ago. I don't remember whether I did it in COBOL or ASM. A PDS consists of two parts, the directory and the member files. You can read the directory using BSAM. It consists (I believe) of 256 byte records. There are 16 16-byte entries in each record, as I recall. Each entry contains the name of the member, its address, and whether it is an alias. The entries in the directory are maintained in ascending order. If the JCL statement points to the PDS without a member name, you will get the directory. You must specify the correct record size in COBOL, which I believe is 256, unblocked.
To read the members, once you have the member name, you need to use another file (DD) name. I think I wrote an ASM subroutine to allow you to stuff the member name before opening the file.
The IBM Technical manuals tell the details of the directory.